// struct: 输入结构

#include <stdio.h>

struct point
{
    int x;
    int y;
};

// void getStruct(struct point);
struct point getStruct(struct point);
void output(struct point);

struct point* getStructPointer(struct point*);
void print(const struct point*);

int main(int argc, char const *argv[])
{
    struct point y = {0, 0};
    // getStruct(y);

    printf("--- 1 ---\n");
    y = getStruct(y);
    output(y);
    printf("--- 1 ---\n");

    // 指针版
    // 指向结构的指针
    struct point* p = &y;

    // 返回指针的好处
    // 输出法1
    printf("--- 2 ---\n");
    output(*getStructPointer(&y));
    printf("--- 2 ---\n");
    printf("--- 3 ---\n");
    // 输出法2
    print(getStructPointer(&y));
    printf("--- 3 ---\n");

    // 甚至可以直接赋值
    printf("--- 4 ---\n");
    *getStructPointer(&y) = (struct point){4, 2};
    output(y);
    printf("--- 4 ---\n");
    
    return 0;
}

// 如果这样，并不能把值返回给 main 中的 y
// void getStruct(struct point p)
// {
//     scanf("%d", &p.x);
//     scanf("%d", &p.y);
//     printf("%d, %d\n", p.x, p.y);
// }

// 解决办法1：返回结构
struct point getStruct(struct point p)
{
    scanf("%d", &p.x);
    scanf("%d", &p.y);
    printf("%d, %d\n", p.x, p.y);

    return p;
}

// 解决方案2：结构指针作为参数
// 教材 《 K & R 》 第131页
// 返回指针的好处：可以在其他函数中使用，程序更简洁
struct point* getStructPointer(struct point* p)
{
    // 指针指向的成员
    // 写法1：(*p).x
    // 写法2：p->x
    scanf("%d", &p->x);
    scanf("%d", &(p->y));
    printf("%d, %d\n", p->x, p->y);

    return p;
}

// 前两种用
void output(struct point p)
{
    printf("%d, %d\n", p.x, p.y);
}

// 指针用
void print(const struct point* p)
{
    printf("%d, %d\n", p->x, p->y);
}